package modelo.diagramas;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.ByteArrayInputStream;

public abstract class ElementoDeLigacao extends ElementoDeModelo {

	public static final String ORIENTACAO_CIMA_DIREITA = "CIMADIREITA";
	public static final String ORIENTACAO_BAIXO_DIREITA = "BAIXODIREITA";
	
	public static final String ORIENTACAO_CIMA_ESQUERDA = "CIMAESQUERDA";
	public static final String ORIENTACAO_BAIXO_ESQUERDA = "BAIXOESQUERDA";
	
	public static final String ORIENTACAO_IGUAL_ESQUERDA = "IGUALESQUERDA";
	public static final String ORIENTACAO_IGUAL_DIREITA = "IGUALDIREITA";
	
	public static final String ORIENTACAO_CIMA_IGUAL = "CIMAIGUAL";
	public static final String ORIENTACAO_BAIXO_IGUAL = "BAIXOIGUAL";
	
	private ElementoDeModelo origem;
	private ElementoDeModelo destino;
	private Color corContorno;
	private String orientacao;
	private int espessuraLinha;
	private String rotuloRelacionamento;
	private int xPosicoes[] = new int[3];
	private int yPosicoes[] = new int [3];

	public ElementoDeLigacao(ElementoDeModelo origem,
			ElementoDeModelo destino, Color corContorno, int espessuraLinha, String rotuloRelacionamento) {
		this.setOrigem(origem);
		this.setDestino(destino);
		this.setCorContorno(corContorno);
		this.setSelecionado(false);
		this.setEspessuraLinha(espessuraLinha);
		this.setRotuloRelacionamento(rotuloRelacionamento);
		this.setLargura(Math.abs(destino.getX() - origem.getX()));
		this.setAltura(Math.abs(destino.getY() - origem.getY()));
		System.out.println("Altura: "+ this.getAltura());
		System.out.println("Largura: "+ this.getLargura());
	}


	public Color getCorContorno() {
		return corContorno;
	}

	public void setCorContorno(Color corContorno) {
		this.corContorno = corContorno;
	}

	public ElementoDeModelo getOrigem() {
		return origem;
	}

	public void setOrigem(ElementoDeModelo origem) {
		this.origem = origem;
	}

	public ElementoDeModelo getDestino() {
		return destino;
	}

	public void setDestino(ElementoDeModelo destino) {
		this.destino = destino;
	}

	public String getOrientacao() {
		// Testa a orientacao do destino em relacao a origem.
		if ( (getDestino().getX() > getOrigem().getX())){
			if (getDestino().getY()-getDestino().getAltura()/2 > getOrigem().getY()){
				this.setOrientacao(ORIENTACAO_BAIXO_DIREITA);
				
				xPosicoes[0] = this.getOrigem().getX()+ this.getOrigem().getLargura();
				yPosicoes[0] = this.getOrigem().getY() + this.getOrigem().getAltura()/2;
				
				xPosicoes[1] = this.getDestino().getX() + this.getDestino().getLargura()/2; 
				yPosicoes[1] = this.getOrigem().getY() + this.getOrigem().getAltura()/2;
				
				xPosicoes[2] = this.getDestino().getX() + this.getDestino().getLargura()/2;
				yPosicoes[2] = this.getDestino().getY();
				
			}else if(getDestino().getY() + getDestino().getAltura()/2 < getOrigem().getY()){
				this.setOrientacao(ORIENTACAO_CIMA_DIREITA);
				
				xPosicoes[0] = this.getOrigem().getX()+ this.getOrigem().getLargura();
				yPosicoes[0] = this.getOrigem().getY() + this.getOrigem().getAltura()/2;
				
				xPosicoes[1] = this.getDestino().getX() + this.getDestino().getLargura()/2; 
				yPosicoes[1] = this.getOrigem().getY() + this.getOrigem().getAltura()/2;
				
				xPosicoes[2] = this.getDestino().getX() + this.getDestino().getLargura()/2;
				yPosicoes[2] = this.getDestino().getY()+ this.getAltura();
				
			}else{
				this.setOrientacao(ORIENTACAO_IGUAL_DIREITA);
			
				xPosicoes[0] = this.getOrigem().getX()+ this.getOrigem().getLargura();
				yPosicoes[0] = this.getOrigem().getY() + this.getOrigem().getAltura()/2;
				
				xPosicoes[1] = this.getDestino().getX(); 
				yPosicoes[1] = this.getOrigem().getY() + this.getOrigem().getAltura()/2;
				
				xPosicoes[2] = this.getDestino().getX();
				yPosicoes[2] = this.getOrigem().getY() + this.getOrigem().getAltura()/2;
				
			}
		}else if( (getDestino().getX() < getOrigem().getX())){
			if (getDestino().getY()-getDestino().getAltura()/2 > getOrigem().getY()){
				this.setOrientacao(ORIENTACAO_BAIXO_ESQUERDA);
				
				xPosicoes[0] = this.getOrigem().getX()+ this.getOrigem().getLargura();
				yPosicoes[0] = this.getOrigem().getY() + this.getOrigem().getAltura()/2;
				
				xPosicoes[1] = this.getDestino().getX() + this.getDestino().getLargura()/2; 
				yPosicoes[1] = this.getOrigem().getY() + this.getOrigem().getAltura()/2;
				
				xPosicoes[2] = this.getDestino().getX()+this.getDestino().getLargura()/2;
				yPosicoes[2] = this.getOrigem().getY() + this.getOrigem().getAltura();
				
				
			}else if (getDestino().getY() + getDestino().getAltura()/2  < getOrigem().getY()){
				this.setOrientacao(ORIENTACAO_CIMA_ESQUERDA);
				
				xPosicoes[0] = this.getOrigem().getX()+ this.getOrigem().getLargura();
				yPosicoes[0] = this.getOrigem().getY() + this.getOrigem().getAltura()/2;
				
				xPosicoes[1] = this.getDestino().getX() + this.getDestino().getLargura()/2; 
				yPosicoes[1] = this.getOrigem().getY() + this.getOrigem().getAltura()/2;
				
				xPosicoes[2] = this.getDestino().getX()+this.getDestino().getLargura()/2;
				yPosicoes[2] = this.getDestino().getY();
				
				
			}else{
				this.setOrientacao(ORIENTACAO_IGUAL_ESQUERDA);
				
				xPosicoes[0] = this.getOrigem().getX()+ this.getOrigem().getLargura();
				yPosicoes[0] = this.getOrigem().getY() + this.getOrigem().getAltura()/2;
				
				xPosicoes[1] = this.getDestino().getX(); 
				yPosicoes[1] = this.getOrigem().getY() + this.getOrigem().getAltura()/2;
				
				xPosicoes[2] = this.getDestino().getX();
				yPosicoes[2] = this.getOrigem().getY() + this.getOrigem().getAltura()/2;
				
				
			}
		}else{
			if (getDestino().getY() > getOrigem().getY()){
				this.setOrientacao(ORIENTACAO_BAIXO_IGUAL);
				
				xPosicoes[0] = this.getOrigem().getX()+ this.getOrigem().getLargura()/2;
				yPosicoes[0] = this.getOrigem().getY() + this.getOrigem().getAltura();
				
				xPosicoes[1] = this.getOrigem().getX()+ this.getOrigem().getLargura()/2; 
				yPosicoes[1] = this.getDestino().getY();
				
				xPosicoes[2] = this.getOrigem().getX()+ this.getOrigem().getLargura()/2; 
				yPosicoes[2] = this.getDestino().getY();
				
			}else{
				this.setOrientacao(ORIENTACAO_CIMA_IGUAL);
				
				xPosicoes[0] = this.getOrigem().getX()+ this.getOrigem().getLargura()/2;
				yPosicoes[0] = this.getOrigem().getY() + this.getOrigem().getAltura();
				
				xPosicoes[1] = this.getOrigem().getX()+ this.getOrigem().getLargura()/2; 
				yPosicoes[1] = this.getDestino().getY();
				
				xPosicoes[2] = this.getOrigem().getX()+ this.getOrigem().getLargura()/2; 
				yPosicoes[2] = this.getDestino().getY();
				
			}
		}
		return orientacao;
	}

	public void setOrientacao(String orientation) {
		this.orientacao = orientation;
	}

	public int getEspessuraLinha() {
		return espessuraLinha;
	}

	public void setEspessuraLinha(int espessuraLinha) {
		this.espessuraLinha = espessuraLinha;
	}


	public String getRotuloRelacionamento() {
		return rotuloRelacionamento;
	}


	public void setRotuloRelacionamento(String rotuloRelacionamento) {
		this.rotuloRelacionamento = rotuloRelacionamento;
	}


	public int[] getxPosicoes() {
		return xPosicoes;
	}


	public void setxPosicoes(int[] xPosicoes) {
		this.xPosicoes = xPosicoes;
	}


	public int[] getyPosicoes() {
		return yPosicoes;
	}


	public void setyPosicoes(int[] yPosicoes) {
		this.yPosicoes = yPosicoes;
	}	
	
}
